(function(window){
	// 引入构造函数 F
	var arr=[],
		push=arr.push;

// 对外公开的函数, 但是原型与构造函数相同, 而且 constructor 也是该函数
// 因此 Icreate 函数也是构造函数
function Icreate(selector){
	return new Icreate.fn.init( selector );
}
// 原型的设置
Icreate.fn =Icreate.prototype = {
	constructor: Icreate,
	init:function(selector){
 		// 获得元素, 设置 this 
 		push.apply(this,Icreate.select(selector));
	},

	each: function (callback) {
		return Icreate.each(this,callback);
	},
	map: function (callback) {
		return Icreate.map(this,callback);
	}
}

// 共享原型
Icreate.fn.init.prototype = Icreate.fn;


// 已经写好的工具方法
Icreate.select = function(selector){
	return document.querySelectorAll(selector);
}
Icreate.isArrayLike=function(obj){
	if(Object.prototype.toString.call(obj) == '[object Array]'){
		return true;
	}
	var length ='length' in obj && obj.length;
	return typeof length ==='number' && length >=0;
};
Icreate.each =function(arr,callback){
	if(Icreate.isArrayLike(arr)){
		for(var i=0;i<arr.length;i++){
			if(callback.call(arr[i],i,arr[i]) === false) break;
		}
	}else{
		for(var k in arr){
			if(callback.call(arr[k],k,arr[k]) === false) break;
		}
	}
	return arr;
}
Icreate.map = function(arr,callback){
	var newArr=[],tmp;
	if(Icreate.isArrayLike(arr)){
		for( var i=0;i<arr.length;i++){
			tmp=callback(arr[i],i);
			if(tmp!=null){
				newArr.push(tmp);
			}
		}
	}else{
		for(var k in arr){
			tmp=callback(arr[k],k);
			if(tmp!=null){
				newArr.push(tmp);
			}
		}
	}
	return newArr;
}



window.Icreate =window.I =Icreate;

})(window);






















